package pe.edu.unmsm.fisi.sysllabus.negocio.servicio.impl;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import pe.edu.unmsm.fisi.sysllabus.integracion.dao.CronogramaAcademicoDAO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.CronogramaAcademicoDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.CursoCronogramaDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.CursoDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.CursoGrupoDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.DocenteDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.GrupoBdDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.PlanEstPeriodoAcademicoDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.modelo.dto.PlanEstudioDTO;
import pe.edu.unmsm.fisi.sysllabus.negocio.servicio.CronogramaAcademicoService;

@Service
public class CronogramaAcademicoServiceImpl implements CronogramaAcademicoService {

	@Resource
	CronogramaAcademicoDAO cronogramaDAO;
	
	@Override
	public List<CronogramaAcademicoDTO> listarCronogramasxAnio(Integer anio)
			throws DataAccessException {
		return cronogramaDAO.selectCronogramaxAnio(anio);
	}
	@Override
	public CronogramaAcademicoDTO obtenerCronogramaAcademico(
			Integer idCronogramaAcademico) throws DataAccessException {
		CronogramaAcademicoDTO cronograma=cronogramaDAO.selectCronograma(idCronogramaAcademico);
		if (cronograma.getIdActualizaSyl().equals(1))
			cronograma.setIdActSyl(true);
		else
			cronograma.setIdActSyl(false);
		cronograma.setCursosCronograma(obtenerCursosxCrongrama(idCronogramaAcademico));
		return cronograma;
	}
	private List<CursoCronogramaDTO> obtenerCursosxCrongrama(
			Integer idCronogramaAcademico) {
		List<GrupoBdDTO> gruposBD=cronogramaDAO.selectCursosxCronograma(idCronogramaAcademico);
		List<CursoCronogramaDTO> cursosCronog=new ArrayList<CursoCronogramaDTO>();
		int idCurso=0;
		for (GrupoBdDTO grupoCur : gruposBD) {
			if(grupoCur.getIdCurso().equals(idCurso)){
				CursoGrupoDTO cursoGrupo=new CursoGrupoDTO();
				cursoGrupo.setNomGrupo(grupoCur.getNomGrupo());
				cursoGrupo.setIdCursoGrupo(grupoCur.getIdGrupo());
				
				DocenteDTO doc=new DocenteDTO();
				doc.setIdDocente(grupoCur.getIdProfesor());
				doc.setNomDocente(grupoCur.getNomProfesor());
				cursoGrupo.setDocente(doc);
				cursosCronog.get(cursosCronog.size()-1).getGrupos().add(cursoGrupo);
			}else{
				idCurso=grupoCur.getIdCurso();
				CursoCronogramaDTO curCro=new CursoCronogramaDTO();
				curCro.setIdCronograma(idCronogramaAcademico);
				curCro.setGrupos(new ArrayList<CursoGrupoDTO>());
				
				CursoDTO curso=new CursoDTO();
				curso.setIdCurso(grupoCur.getIdCurso());
				curso.setNomCurso(grupoCur.getNomCurso());
				
				PlanEstudioDTO planEstudio=new PlanEstudioDTO();
				planEstudio.setDesPlanEstudio(grupoCur.getDesPlanEstudio());
				curso.setPlanEstudio(planEstudio);
				
				PlanEstPeriodoAcademicoDTO periodoAcademico=new PlanEstPeriodoAcademicoDTO();
				periodoAcademico.setNomPeriodo(grupoCur.getNomPeriodo());
				curso.setPeriodoAcademico(periodoAcademico);
				
				CursoGrupoDTO cursoGrupo=new CursoGrupoDTO();
				cursoGrupo.setNomGrupo(grupoCur.getNomGrupo());
				cursoGrupo.setIdCursoGrupo(grupoCur.getIdGrupo());
				
				DocenteDTO doc=new DocenteDTO();
				doc.setIdDocente(grupoCur.getIdProfesor());
				doc.setNomDocente(grupoCur.getNomProfesor());
				cursoGrupo.setDocente(doc);
				curCro.getGrupos().add(cursoGrupo);
				curCro.setCurso(curso);
				cursosCronog.add(curCro);
			}
		}
		return cursosCronog;
	}
	@Override
	public void guardarCronograma(CronogramaAcademicoDTO cronogramaEditar) {
		Integer idCrononograma=0;
		if (cronogramaEditar.isIdActSyl())
			cronogramaEditar.setIdActualizaSyl(1);
		else
			cronogramaEditar.setIdActualizaSyl(0);
		
		if (cronogramaEditar.getIdCronogramaAcademico()==null) {
			idCrononograma=cronogramaDAO.insertCronograma(cronogramaEditar);
		} else {
			cronogramaDAO.updateCronograma(cronogramaEditar);
			idCrononograma=cronogramaEditar.getIdCronogramaAcademico();
		}
		cronogramaDAO.deleteAllCursosxCronograma(idCrononograma);
		for (CursoCronogramaDTO cursoCronograma : cronogramaEditar.getCursosCronograma()) {
			for (CursoGrupoDTO grupo : cursoCronograma.getGrupos()) {
				cronogramaDAO.insertGrupoCurso(cursoCronograma.getCurso().getIdCurso(), idCrononograma, 
						grupo.getDocente().getIdDocente(), grupo.getNomGrupo(), grupo.getIdCursoGrupo());
			}
		}
	}

}
